package QianFeng07.IODemo;

import java.io.*;

/**
 * 缓冲流
 * 首先要明确一一个概念:
 * 对文件或其它目标频繁的读写操作，效率低，性能差。
 * 使用缓神流的好处是，能够更高效的读写信息，原理是将数据先缓冲起来，然后一起写入或者读取出来。
 * <p>
 * 字节缓冲流：
 * BufferedInputStream:为另一个输入流添加一些功能，在创建BufferedInputStream时，会创建一个内部缓冲区数组，用于缓冲数据。
 * ————默认缓存大小时8KB，先读取到数组缓存中，存储满后在读取到程序中
 * BufferedOutputStream:通过设置这种输出流，应用程序就可以将各个字节写入底层输出流中，而不必针对每次字节写入调用底层系统。
 * ————默认缓存大小时8KB，每次写入时先存储到缓存中的byte数组中，当数组存储满时，会把数组中的数据写入文件，并且缓存下标归零
 * <p>
 * 字符缓冲流：
 * 1.加入字符缓冲流，增强读取功能（readLine）
 * 2.更高效的读取数据
 * 3.FileReader：内部使用InputStreamReader（sun.nio.cs.StreamDecoder)，解码过程，byte->char，默认缓存大小时8KB
 * BufferedReader:从字符输入流中读取文本，缓冲各个字符，从而实现字符、数组和行的高效读职。
 *  ————默认缓存大小时8KB，但是可以手动指定大小，把数据读取到缓存中，减少每次转换过程，效率更高
 * BufferedWriter:将文本写入字符输出流，缓冲各个字符，从而提供单个字符、数组和字符宰的高效写入。
 *  ————默认缓存大小时8KB
 **/
public class BufferStreamDemo {

    public static void main(String[] args) {
        byteWrite();
        byteRead();
    }

    /*字节缓冲流*/
    //输入（读取文件）
    private static void byteRead() {
        File file = new File("F:\\Test\\Test.txt");
        try {
            //BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file)) 简写
            InputStream inputStream = new FileInputStream(file);
            //构造一个字节缓冲流
            BufferedInputStream bis = new BufferedInputStream(inputStream);//不能单独存在，依赖于FileInputStream

            byte[] bytes = new byte[1024];
            int len = -1;
            while ((len = bis.read(bytes)) != -1) {
                System.out.println(new String(bytes, 0, len));
            }
            bis.close();//关闭后刷新缓存写入文件
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //输出（写入文件）
    private static void byteWrite() {
        File file = new File("F:\\Test\\Test.txt");
        try {
            //BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file)) 简写
            OutputStream outputStream = new FileOutputStream(file);
            //构造一个字节缓冲流
            BufferedOutputStream bos = new BufferedOutputStream(outputStream);//不能单独存在，依赖于FileOutputStream
            String info = "小河还是流水哗啦啦";
            //outputStream.write(info.getBytes()); 直接写入文件
            bos.write(info.getBytes());//放入缓存中
            bos.close();//关闭后刷新缓存写入文件
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /*字符缓冲流*/
    //输入（读取文件）
    private static void charReader() {
        File file = new File("F:\\Test\\Test.txt");
        try {
            //BufferedReader brd = new BufferedReader(new FileReader(file))简写
            Reader reader = new FileReader(file);
            BufferedReader brd = new BufferedReader(reader);
            char[] cs = new char[1024];
            int len = -1;
            while ((len = brd.read(cs)) != -1) {
                System.out.println(new String(cs, 0, len));
            }
            brd.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //输出（写入文件）
    private static void charWriter() {
        File file = new File("F:\\Test\\Test.txt");
        try {
            //BufferedReader brd = new BufferedReader(new FileReader(file))简写
            Writer writer = new FileWriter(file);
            BufferedWriter brw = new BufferedWriter(writer);
            brw.write("村花到我家");
            brw.flush();
            brw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
